/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-03-31
 * Time: 22:51
 */

/**
 * 演示 == 和 equals() 的比较行为
 * 核心规则：
 * 1. == 对基本类型比较值，对引用类型比较地址
 * 2. equals() 默认比较地址，重写后可比较内容
 */
public class Main {
    public static void main(String[] args) {
        // ========== 1. 基本类型比较（比较值） ==========
        int num1 = 10;
        int num2 = 10;
        int num3 = 20;
        System.out.println("===========基本类型比较]===========");
        System.out.println("num1 == num2: " + (num1 == num2)); // true，值相同
        System.out.println("num1 == num3: " + (num1 == num3)); // false，值不同

        // ========== 2. 引用类型比较（比较地址） ==========
        System.out.println("\n=======引用类型比较（比较地址）=======");

        // 示例1：String 类型（特殊处理）
        String str1 = new String("hello"); // 新对象，地址A
        String str2 = new String("hello"); // 新对象，地址B
        String str3 = str1;                // 指向地址A

        System.out.println("str1 == str2: " + (str1 == str2));   // false，因为new创建的String对象地址不同
        System.out.println("str1 == str3: " + (str1 == str3));   // true，相同地址（因为str3直接指向str1的地址）
        System.out.println("str1.equals(str2): " + str1.equals(str2)); // true，String类重写了equals()比较内容

        // 示例2：自定义类（未重写 equals）
        Student stu1 = new Student("S001", "张三"); // 地址X
        Student stu2 = new Student("S001", "张三"); // 地址Y
        Student stu3 = stu1;                        // 地址X

        System.out.println("\n======未重写equals的Student类======");
        System.out.println("stu1 == stu2: " + (stu1 == stu2));       // false，因为不同对象地址不同
        System.out.println("stu1 == stu3: " + (stu1 == stu3));       // true，相同地址
        System.out.println("stu1.equals(stu2): " + stu1.equals(stu2)); // false，因为未重写equals，默认按地址比较

        // ========== 3. 重写 equals 后的比较（比较内容） ==========
        System.out.println("\n=======重写equals的Student2类=======");
        Student2 stu2_1 = new Student2("S002", "李四"); // 地址M
        Student2 stu2_2 = new Student2("S002", "李四"); // 地址N

        System.out.println("stuV2_1 == stuV2_2: " + (stu2_1 == stu2_2));         // false，因为不同对象地址不同
        System.out.println("stuV2_1.equals(stuV2_2): " + stu2_1.equals(stu2_2)); // true，重写equals内容相同
    }
}
/*输出：
        ===========基本类型比较]===========
        num1 == num2: true
        num1 == num3: false

        =======引用类型比较（比较地址）=======
        str1 == str2: false
        str1 == str3: true
        str1.equals(str2): true

        ======未重写equals的Student类======
        stu1 == stu2: false
        stu1 == stu3: true
        stu1.equals(stu2): false

        =======重写equals的Student2类=======
        stuV2_1 == stuV2_2: false
        stuV2_1.equals(stuV2_2): true*/

